/*
 * @(#)NetworkCanvasDVMRP.java	  05.09.1997  Robert Denda&Didier Gutacker
 *
 */

import java.awt.* ;

/** 
 * Die Klasse NetworkCanvasDVMRP stellt dem Netzwerk das Zeichenbrett zur Verfuegung
 * Sie ist integriert in ein scollbares Zeichenbrett ScrolledNetworkCanvas
 *
 * @author 	Robert Denda
 * @version     1.1, 05.09.1997
 * @see NetzCanvas
 * @see ScrolledNetworkCanvasDVMRP
 * @see Network
 *
 */

public final class NetworkCanvasDVMRP extends NetzCanvas {

  public Network net;
  private boolean sendPruningMessageFlag;
  private boolean sendGraftingMessageFlag;
 
  public NetworkCanvasDVMRP( Simulation simulation, SimulationFrame frame , int w, int h, Scrollbar verticalScroll,Scrollbar horizontalScroll ) {
    super(simulation,frame,w,h,verticalScroll,horizontalScroll);
    sendPruningMessageFlag = false;
    sendGraftingMessageFlag = false;
    net = new Network( simulation, frame, this, nodeWidth, nodeHeight );
  } // NetworkCanvasDVMRP.NetworkCanvasDVMRP
  

   /**
   * Halte alle Netzaktivitaeten an
   */

  synchronized public final void stopRequest() {
    stopped = true;
    net.suspend();
  } // NetworkCanvas.stopRequest

  /**
   * Reaktiviere das Netzwerk
   */

  synchronized public final void continueRequest() {
    net.resume();
    stopped = false;
  } // NetworkCanvas.continueRequest

   /**
   * Beende den Netzwerkbetrieb
   * @see Network#finishUp
   */

  public void finishUp() {
    net.finishUp();
  } // NetzCanvas.finishUp

  /**
   * Setze die Animationsgeschwindigkeit
   * @see Netzwerk#setSpeed
   */

  public final void setAnimationSpeed( int i ) {
    net.setSpeed( i );
  } // NetzCanvas.setAnimationSpeed

  /**
   * Starte Client Betriebsmodus
   * @see SimulationObject#startRemote
   */

  public final void startRemote() {
    net.startRemote();
  } // NetzCanvas.startRemote

  public void startDemo() {
    net.startDemo();
  } // NetzCanvas.startDemo

  /**
   * Mausbewegungen werden weitergeleitet an das Netzwerk (falls kein Client Betrieb
   * vorliegt)
   * @see Network#mouseMoveNotify
   * @see SimulationClient
   */
  
  public boolean mouseMove( Event e, int x, int y ) {
    if ( !frame.isClient() ) {
      mouseXPos = x;
      mouseYPos = y;
      if ( ! stopped ) {
	net.mouseMoveNotify( e, x, y );
      } // if
    } // if
    return true;
  } // NetzCanvas.mouseMove

  /**
   * Maustastenbewegungen werden weitergeleitet an das Netzwerk (falls kein Client Betrieb
   * vorliegt)
   * @see Network#mouseDownNotify
   * @see SimulationClient
   */

  public boolean mouseDown( Event e, int x, int y ) {
    if ( !frame.isClient() ) {
      net.mouseDownNotify( e, x, y );
    } // if
    return true;
  } // NetzCanvas.mouseDown

  /**
   * Sendet Zeichnenauftrag an das Netz.  Vorher wird der Ursprung anhand der
   * Position der Scrollbalken des ScrolledNetworkCanvas neu berechnet
   * @see ScrolledNetworkCanvas
   * @see Netzwerk#repaintAll
   * @see SimulationObject#translate
   */

  public void paint( Graphics gc ) {
    int x = - width * horizontalScroll.getValue() / horizontalScroll.getMaximum();
    int y = - height * verticalScroll.getValue() / verticalScroll.getMaximum();
    super.paint( gc );
    net.translate( x, y );
    net.repaintAll();
  } // NetworkCanvas.paint 

  /** 
   * Liefert das Netzwerkobjekt
   * @see Network
   */

  public final Network getNetwork() {
    return net;
  } // NetzCanvas.getNetwork

  /**
   * Wenn die Maus auf das Zeichenbrett geht und irgendwelche Ereignisse vorher
   * durch den Druck einer Taste im ButtonPanel gewaehlt wurden, wird hier
   * das entsprechende Ereignis an das Netzwerk gesendet
   * @see ButtonPanel
   * @see Network
   */

    public boolean mouseEnter( Event e, int x, int y ) {
    if ( !frame.isClient() ) {
      if ( ! stopped ) {
	if ( addLinkFlag ) {
	  net.addLink();
	  addLinkFlag = false;
	} else if ( addNodeFlag ) {
	  net.addNode( x, y );
	  addNodeFlag = false;
	} else if ( removeNodeFlag ) {
	  net.removeNode();
	  removeNodeFlag = false;
	} else if ( removeLinkFlag ) {
	  net.removeLink();
	} else if ( startSendingFlag ) {
	  net.startSending();
	  startSendingFlag = false;
	} else if ( stopSendingFlag ) {
	  net.stopSending();
	  stopSendingFlag = false;
	} else if ( sendPruningMessageFlag ) {
	  net.sendPruningMessage();
	  sendPruningMessageFlag = false;
	} else if ( sendGraftingMessageFlag ) {
	  net.sendGraftingMessage();
	  sendGraftingMessageFlag = false;
	} else if ( inspectRoutingTableFlag ) {
	  net.inspectRoutingTable();
	  inspectRoutingTableFlag = false;
	} // if 
      } // if
    } // if
    return true;
  } // NetworkCanvasDVMRP.mouseEnter
    
  /**
   * Signalisiere, dass die "Sende Prune" Taste gedrueckt wurde
   * @see NetworkCanvasDVMRP#unsetFlags
   * @see NetworkCanvasDVMRP#sendGraftingMessageRequest
   */

  synchronized public final void sendPruningMessageRequest() {
    unsetFlags();
    sendPruningMessageFlag = true;
  } // NetworkCanvaas.sendPruningMessageRequest

  /**
   * Signalisiere, dass die "Sende Graft" Taste gedrueckt wurde
   * @see NetworkCanvasDVMRP#unsetFlags
   * @see NetworkCanvasDVMRP#sendPruningMessageRequest
   */

  synchronized public final void sendGraftingMessageRequest() {
    unsetFlags();
    sendGraftingMessageFlag = true;
  } // NetworkCanvasDVMRP.sendGraftingMessageRequest

  /**
   * Setze alle Signalisierungen zurueck
   */

  void unsetFlags() {
    super.unsetFlags();
    sendPruningMessageFlag = false;
  } // NetworkCanvasDVMRP.unsetFlags

} // NetworkCanvasDVMRP

